
import org.junit.jupiter.api.Assertions;

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.MethodSource;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

import java.time.Duration;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

import static java.lang.Thread.sleep;


/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-04-11
 * Time: 8:14
 */
public class Blog_loginTest extends AutoUtil {


    public static Stream<Arguments> paramMethod() {
        return Stream.of(
//                Arguments.arguments("admin", "111111"),
                Arguments.arguments("admin", "admin2")
        );
    }

    /**
     * 输入正确的账号和密码进行测试
     */
    @ParameterizedTest
    @MethodSource("paramMethod")
    public void loginSuccess(String username, String password) throws InterruptedException {

        // 1. 打开登陆界面
        webDriver.get("http://127.0.0.1:11111/login3.html");
        // 2. 输入账号
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);

        // 3. 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);

        // 4. 点击登陆
        webDriver.findElement(By.cssSelector("#submit-button")).click();

        // 添加隐式等待, 防止无法及时获取到弹窗点击确认从而无法跳转
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

        // 5. 处理弹窗点击确定
        Alert alert = webDriver.switchTo().alert();
        alert.accept();

        // 添加隐式等待, 防止页面加载不成功
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

        // 6. 获取正确登录后当前页面 URL
        String url = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://127.0.0.1:11111/myblog_list1.html", url);

    }


    /**
     * 错误的账号密码登陆
     *
     * @param username 用户名
     * @param password 密码
     * @param url      登陆页 url
     */
    @Disabled
    @ParameterizedTest
    @CsvFileSource(resources = "failed.csv")
    public void loginFailed(String username, String password, String url) {

        // 1. 打开登陆界面
        webDriver.get("http://127.0.0.1:11111/login3.html");

        // 清空输入框
        webDriver.findElement(By.cssSelector("#username")).clear();
        webDriver.findElement(By.cssSelector("#password")).clear();

        // 2. 输入账号
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);

        // 3. 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);

        // 4. 点击登陆
        webDriver.findElement(By.cssSelector("#submit-button")).click();

        // 5. 隐式等待
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

        // 6. 获取弹窗内容
        Alert alert = webDriver.switchTo().alert();
        String waring = alert.getText();
        alert.accept();

        // 7. 断言
        Assertions.assertEquals("登陆失败 : 用户名或密码错误", waring);
        Assertions.assertEquals(url, webDriver.getCurrentUrl());
    }


    /**
     * 获取登陆后首页的文章以及翻页后所有文章展示是否正常
     */
    @Test
    @Disabled
    public void getListTitle() {
        // 打开博客主页
        webDriver.get("http://127.0.0.1:11111/blog_list.html?pageIndex=1&pageSize=2");

        // 获取页面所有标题并统计文章数
        // 当前第一页
        int title_size1 = webDriver.findElements(By.cssSelector(".title")).size();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        Assertions.assertNotEquals(0, title_size1);

//        // 7.第二页
//        webDriver.findElement(By.cssSelector("#pageDiv > button:nth-child(3)")).click();
//        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//        int title_size2 = webDriver.findElements(By.cssSelector(".title")).size();
//        Assertions.assertNotEquals(0, title_size2);
//
//        // 第三页
//        webDriver.findElement(By.cssSelector("#pageDiv > button:nth-child(3)")).click();
//        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//        int title_size3 = webDriver.findElements(By.cssSelector(".title")).size();
//        Assertions.assertNotEquals(0, title_size3);
//
//        // 再次点击已经到达尾页, 触发弹窗
//        webDriver.findElement(By.cssSelector("#pageDiv > button:nth-child(3)")).click();
//        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
//
//        Alert alert2 = webDriver.switchTo().alert();
//        String text = alert2.getText();
//        alert2.accept();
//        Assertions.assertEquals("当前已位于末页!", text);

    }


    /**
     * 点击第一篇文章查看全文
     */
    @Test
    @Disabled
    public void viewArticle() {
        // 打开博客主页
        webDriver.get("http://127.0.0.1:11111/blog_list.html?pageIndex=1&pageSize=2");
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

        // 2. 获取首页第一篇文章的全文按钮并点击
        webDriver.findElement(By.xpath("//*[@id=\"myArticleList\"]/div[2]/a")).click();
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

        // 3. 检验详情页元素
        // 3.1 检查标题
        String title = webDriver.findElement(By.cssSelector("#title")).getText();
        Assertions.assertEquals("我的第一篇文章", title);
        // 3.2 检查左侧用户栏的用户名
        String username = webDriver.findElement(By.xpath("//*[@id=\"author2\"]")).getText();
        Assertions.assertEquals("admin", username);
        // 检查左侧文章数目
        String artCount = webDriver.findElement(By.cssSelector("#countArt")).getText();
        Assertions.assertEquals("5", artCount);
        // 3.3 检查文章作者
        String author = webDriver.findElement(By.xpath("//*[@id=\"author\"]")).getText();
        Assertions.assertEquals("admin", author);
        // 3.4 检查文章阅读量
        // 阅读量测试需要注意访问时也会给阅读量 + 1
//        String count = webDriver.findElement(By.cssSelector("#rcount")).getText();
//        Assertions.assertEquals("10", count);
        // 3.5 检查文章发布时间
        String createTime = webDriver.findElement(By.cssSelector("#createtime")).getText();
        Assertions.assertEquals("2023-06-15 19:36:25", createTime);

    }


    @Test
    public void writeBlog() throws InterruptedException {

        // 1. 打开登陆界面
        webDriver.get("http://127.0.0.1:11111/login3.html");

        // 清空输入框
        webDriver.findElement(By.cssSelector("#username")).clear();
        webDriver.findElement(By.cssSelector("#password")).clear();

        // 2. 输入账号
        webDriver.findElement(By.cssSelector("#username")).sendKeys("admin");

        // 3. 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys("admin2");

        // 4. 点击登陆
        webDriver.findElement(By.cssSelector("#submit-button")).click();

        // 5. 隐式等待
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

        // 6. 获取弹窗内容
        Alert alert1 = webDriver.switchTo().alert();
        alert1.accept();


        // 1. 在博客详情页时, 点开写博客
        webDriver.manage().window().maximize();
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        sleep(3000);
        webDriver.findElement(By.cssSelector("#LoginShow > a:nth-child(4)")).click();
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

        // 2. 找到标题框进行输入
        webDriver.findElement(By.cssSelector("#title")).sendKeys("自动化测试");

        // 3. 找到摘要框进行输入
        webDriver.findElement(By.cssSelector("#description")).sendKeys("测试自动化");

        // 4. 输入文本框内容
        webDriver.findElement(By.xpath("#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span > span")).clear();
        webDriver.findElement(By.cssSelector("#editorDiv > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre")).sendKeys(" 自动化测试脚本 ");

        // 5. 点击发布文章
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

        // 6. 获取弹窗
        Alert alert = webDriver.switchTo().alert();
        Assertions.assertEquals("添加成功, 是否继续添加 ?", alert.getText());
        // 点击取消按钮停止继续发布文章
        alert.dismiss();

        // 7. 跳转到主页
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        Assertions.assertEquals("http://127.0.0.1:11111/myblog_list1.html", webDriver.getCurrentUrl());
    }

}
